from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from . models import SKU
from django.core.paginator import Paginator, EmptyPage
from . utils import get_breadcrumb

# Create your views here.

# 分页列表
class ListView(View):
    """商品列表页"""
    def get(self, request, category_id):

        # 1.提取参数
        page = request.GET.get('page') #第几页
        page_size = request.GET.get('page_size') # 每页几个
        ordering = request.GET.get('ordering') # 按照什么排序
        # 2.校验参数,参数是前端传的，可以不用校验
        # 3.业务数据处理--根据分类过滤sku商品，排序分页返回
        # 3.1过滤＋排序（过滤出第三级的商品）
        skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by(ordering)
        # 3.2分页
        # 实例化分页器对象
        paginator = Paginator(skus, page_size)# 根据每页page_size条对查询集skus进行分页
        try:
            # 找对象的方法获取所需的页数据
            page_skus = paginator.page(page) #　指定获得第page页, page_skus是skus的一个子集
        except EmptyPage as e:
            return JsonResponse({'code': 400, 'errmsg': '页面不存在'})
        # 3.3把分页子集构建响应参数
        sku_list = []

        for sku in page_skus:
            sku_list.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })

        # 分页器对象中属性num_pages:总页数
        total_page = paginator.num_pages
        # 面包屑导航数据
        breadcrumb = get_breadcrumb(category_id)
        # 4.构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'breadcrumb': breadcrumb,
            'list': sku_list,
            'count': total_page
        })

# 热销商品
class HotGoodsView(View):
    """提供商品热销排行 JSON 数据"""
    def get(self, request, category_id):
        # 1.提取参数
        # 2.校验参数
        # 3.业务数据处理--根据销量降序排列，返回两个
        # 根据销量倒序
        try:
            skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')[0:2]  # 查询集可以切片操作，前两条
        except EmptyPage as e:
            return JsonResponse({'code': 400, 'errmsg': '获取商品错误'})

        # 转换格式:
        hot_skus = []
        for sku in skus:
            hot_skus.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })
        # 4.构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'hot_skus': hot_skus
        })



# 导入:SearchView是haystack提供打一个视图类，对应的接口：GET+/search/?q=华为
from haystack.views import SearchView
# 搜索接口,只需要继承默认搜索视图,重写返回的响应数据
class MySearchView(SearchView):
    '''重写SearchView类'''
    def create_response(self):
        # page = self.request.GET.get('page')

        # 1.获取haystack中es中全文检索的结果
        context = self.get_context() # 自动根据查询字符串参数q检索并且根据分页相关参数进行分页

        # 用户搜索词: context['query']
        # 分页器对象: context['paginator']
        # 默认每页数量: context['paginator'].per_page
        # 数据总量: context['paginator'].count

        # 当前页对象: context['page']
        # 搜索结果列表: context['page'].object_list
        # 搜索结果对象: SearchResult对象
        # 对应的模型对象: SearchResult.object属性


        # 2.根据结果找到sku商品数据来构建响应参数
        data_list = []
        for result in context['page'].object_list:
            # result:是一个SearchResult对象
            sku=result.object # 这个才是sku对象
            data_list.append({
                'id':sku.id,
                'name':sku.name,
                'price':sku.price,
                'default_image_url':sku.default_image.url,
                'searchkey':context.get('query'), # 用户搜索关键词
                'page_size':context['page'].paginator.num_pages,
                'count':context['page'].paginator.count
            })
        # 拼接参数, 返回
        return JsonResponse(data_list, safe=False)